package com.hy.${packageCode}.shared.distribute.rate;

import java.util.concurrent.TimeUnit;

/**
 * 分布式限流器 定义
 */
public interface DistRateLimiter {
    /**
     * 尝试设置速率
     *
     * @param rateInInterval
     * @param rateIntervalSecond
     */
    void trySetRate(long rateInInterval, long rateIntervalSecond);

    /**
     * 尝试获取一个 permit
     *
     * @return 是否成功
     */
    boolean tryAcquire();

    /**
     * 尝试获取N个 permit
     *
     * @return 是否成功
     */
    boolean tryAcquire(int permits);

    /**
     * 获取一个 permit ，如果不可用则会等待
     */
    void acquire();

    /**
     * 获取N个 permit ，如果不可用则会等待
     */
    void acquire(int permits);

    /**
     * 在给定的时间里尝试获取一个permit
     *
     * @param timeout 等待时间值
     * @param unit    等待时间单位
     * @return 是否成功
     */
    boolean tryAcquire(long timeout, TimeUnit unit);

    /**
     * 在给定的时间里尝试获取N个permit
     *
     * @param timeout 等待时间值
     * @param unit    等待时间单位
     * @return 是否成功
     */
    boolean tryAcquire(int permits, long timeout, TimeUnit unit);
}
